# RocketMQ 的通信传输

## 1. 概述

Apache RocketMQ 是一款典型的分布式架构下的中间件产品，使用异步通信方式和发布订阅的消息传输模型。通信方式和传输模型的具体说明，请参见下文通信方式介绍和消息传输模型介绍

## 2. 通信技术

分布式系统架构思想下，将复杂系统拆分为多个独立的子模块，例如微服务模块。此时就需要考虑子模块间的远程通信，典型的通信模式分为以下两种，一种是同步的 RPC 远程调用；一种是基于中间件代理的异步通信方式。

### 同步 RPC 调用模型

<img
  src="/message-middleware/syncarchi-ebbd41e1afd6adf432792ee2d7a91748.png"
  alt="同步模型"
  width="800"
  height="800"
/>
同步RPC调用模型下，不同系统之间直接进行调用通信，每个请求直接从调用方发送到被调用方，然后要求被调用方立即返回响应结果给调用方，以确定本次调用结果是否成功。
注意 此处的同步并不代表RPC的编程接口方式，RPC也可以有异步非阻塞调用的编程方式，但本质上仍然是需要在指定时间内得到目标端的直接响应。

### 异步通信模型

<img
  src="/message-middleware/mainarchi-9b036e7ff5133d050950f25838367a17.png"
  alt="异步模型"
  width="1200"
  height="800"
/>

## 2. 消息传输模型介绍

主流的消息中间件的传输模型主要为点对点模型和发布订阅模型。

### 点对点模型

<img
  src="/message-middleware/p2pmode-fefdc2fbe4792e757e26befc0b3acbff.png"
  alt="异步模型"
  width="1000"
  height="800"
/>
点对点模型也叫队列模型，具有如下特点：{" "}

- 消费匿名：消息上下游沟通的唯一的身份就是队列，下游消费者从队列获取消息无法申明独立身份。
- 一对一通信：基于消费匿名特点，下游消费者即使有多个，但都没有自己独立的身份，因此共享队列中的消息，每一条消息都只会被唯一一个消费者处理。因此点对点模型只能实现一对一通信。

### 发布订阅模型

<img
  src="/message-middleware/pubsub-042a4e5e5d76806943bd7dcfb730c5d5.png"
  alt="异步模型"
  width="1000"
  height="800"
/>
发布订阅模型具有如下特点：

- 消费独立：相比队列模型的匿名消费方式，发布订阅模型中消费方都会具备的身份，一般叫做订阅组（订阅关系），不同订阅组之间相互独立不会相互影响。
- 一对多通信：基于独立身份的设计，同一个主题内的消息可以被多个订阅组处理，每个订阅组都可以拿到全量消息。因此发布订阅模型可以实现一对多通信。
